package com.kangaroo.myhome.utils;


import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public final class JsonUtils  
{  
  
    /** 
     * 把对象封装为JSON格式 
     *  
     * @param o 
     *            对象 
     * @return JSON格式 
     */  
    @SuppressWarnings("rawtypes")
	public static String toJson(final Object o)  
    {  
        if (o == null)  
        {  
            return "null";  
        }  
        if (o instanceof String) //String  
        {  
            return string2Json((String) o);  
        }  
        if (o instanceof Boolean) //Boolean  
        {  
            return boolean2Json((Boolean) o);  
        }  
        if (o instanceof Number) //Number  
        {  
            return number2Json((Number) o);  
        }  
        if (o instanceof Map) //Map  
        {  
            return map2Json((Map) o);  
        }  
        if (o instanceof Collection) //List  Set  
        {  
            return collection2Json((Collection) o);  
        }  
        if (o instanceof Object[]) //对象数组  
        {  
            return array2Json((Object[]) o);  
        }  
  
        if (o instanceof int[])//基本类型数组  
        {  
            return intArray2Json((int[]) o);  
        }  
        if (o instanceof boolean[])//基本类型数组  
        {  
            return booleanArray2Json((boolean[]) o);  
        }  
        if (o instanceof long[])//基本类型数组  
        {  
            return longArray2Json((long[]) o);  
        }  
        if (o instanceof float[])//基本类型数组  
        {  
            return floatArray2Json((float[]) o);  
        }  
        if (o instanceof double[])//基本类型数组  
        {  
            return doubleArray2Json((double[]) o);  
        }  
        if (o instanceof short[])//基本类型数组  
        {  
            return shortArray2Json((short[]) o);  
        }  
        if (o instanceof byte[])//基本类型数组  
        {  
            return byteArray2Json((byte[]) o);  
        }  
        if (o instanceof Object) //保底收尾对象  
        {  
            return object2Json(o);  
        }  
  
        throw new RuntimeException("不支持的类型: " + o.getClass().getName());  
    }  
  
    /** 
     * 将 String 对象编码为 JSON格式，只需处理好特殊字符 
     *  
     * @param s 
     *            String 对象 
     * @return JSON格式 
     */  
    static String string2Json(final String s)  
    {  
        final StringBuffer sb = new StringBuffer(s.length() + 20);  
        sb.append('\"');  
        for (int i = 0; i < s.length(); i++)  
        {  
            final char c = s.charAt(i);  
            switch (c)  
            {  
            case '\"':  
                sb.append("\\\"");  
                break;  
            case '\\':  
                sb.append("\\\\");  
                break;  
            case '/':  
                sb.append("\\/");  
                break;  
            case '\b':  
                sb.append("\\b");  
                break;  
            case '\f':  
                sb.append("\\f");  
                break;  
            case '\n':  
                sb.append("\\n");  
                break;  
            case '\r':  
                sb.append("\\r");  
                break;  
            case '\t':  
                sb.append("\\t");  
                break;  
            default:  
                sb.append(c);  
            }  
        }  
        sb.append('\"');  
        return sb.toString();  
    }  
  
    /** 
     * 将 Number 表示为 JSON格式 
     *  
     * @param number 
     *            Number 
     * @return JSON格式 
     */  
    static String number2Json(final Number number)  
    {  
        return number.toString();  
    }  
  
    /** 
     * 将 Boolean 表示为 JSON格式 
     *  
     * @param bool 
     *            Boolean 
     * @return JSON格式 
     */  
    static String boolean2Json(final Boolean bool)  
    {  
        return bool.toString();  
    }  
  
    /** 
     * 将 Collection 编码为 JSON 格式 (List,Set) 
     *  
     * @param c 
     * @return 
     */  
    @SuppressWarnings("rawtypes")
	static String collection2Json(final Collection c)  
    {  
        final Object[] arrObj = c.toArray();  
        return toJson(arrObj);  
    }  
  
    /** 
     * 将 Map<String, Object> 编码为 JSON 格式 
     *  
     * @param map 
     * @return 
     */  
    @SuppressWarnings("rawtypes")
	static String map2Json(final Map map)  
    {  
        if (map.isEmpty())  
        {  
            return "{}";  
        }  
        final StringBuffer sb = new StringBuffer(map.size() << 4); //4次方  
        sb.append('{');  
        final Set keys = map.keySet();
        Iterator iterator = keys.iterator();
        while(iterator.hasNext()){
        	Object key = iterator.next();
            final Object value = map.get(key); 
            sb.append('\"');  
            sb.append(key); //不能包含特殊字符  
            sb.append('\"');  
            sb.append(':');  
            sb.append(toJson(value)); //循环引用的对象会引发无限递归  
            sb.append(',');  
        }  
        // 将最后的 ',' 变为 '}':   
        sb.setCharAt(sb.length() - 1, '}');  
        return sb.toString(); 
    }  
  
    /** 
     * 将数组编码为 JSON 格式 
     *  
     * @param array 
     *            数组 
     * @return JSON 格式 
     */  
    static String array2Json(final Object[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4); //4次方  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final Object o = array[i];
            sb.append(toJson(o));  
            sb.append(',');  
        }  
        // 将最后添加的 ',' 变为 ']':   
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String intArray2Json(final int[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final int o = array[i];
            sb.append(Integer.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String longArray2Json(final long[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final long o = array[i];
            sb.append(Long.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String booleanArray2Json(final boolean[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final boolean o = array[i]; 
            sb.append(Boolean.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String floatArray2Json(final float[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final float o = array[i];
            sb.append(Float.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String doubleArray2Json(final double[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final double o = array[i]; 
            sb.append(Double.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String shortArray2Json(final short[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final short o = array[i]; 
            sb.append(Short.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    static String byteArray2Json(final byte[] array)  
    {  
        if (array.length == 0)  
        {  
            return "[]";  
        }  
        final StringBuffer sb = new StringBuffer(array.length << 4);  
        sb.append('[');  
        for(int i=0;array!=null&&i<array.length;i++){
        	final byte o = array[i];
            sb.append(Byte.toString(o));  
            sb.append(',');  
        }  
        // set last ',' to ']':  
        sb.setCharAt(sb.length() - 1, ']');  
        return sb.toString();  
    }  
  
    public static String object2Json(final Object bean)  
    {  
        //数据检查  
        if (bean == null)  
        {  
            return "{}";  
        }  
        final Method[] methods = bean.getClass().getMethods(); //方法数组  
        final StringBuffer sb = new StringBuffer(methods.length << 4); //4次方  
        sb.append('{');  
  
        for(int i=0;methods!=null&&i<methods.length;i++){
        	final Method method = methods[i];
            try  
            {  
                final String name = method.getName();  
                String key = "";  
                if (name.startsWith("get"))  
                {  
                    key = name.substring(3);  
  
                    //防死循环  
                    final String[] arrs =  
                    { "Class" };  
                    boolean bl = false;  
                    for(int j=0;arrs!=null&&j<arrs.length;j++){
                    	final String s = arrs[j]; 
                        if (s.equals(key))  
                        {  
                            bl = true;  
                            continue;  
                        }  
                    }  
                    if (bl)  
                    {  
                        continue; //防死循环  
                    }  
                }  
                else if (name.startsWith("is"))  
                {  
                    key = name.substring(2);  
                }  
                if (key.length() > 0 && Character.isUpperCase(key.charAt(0)) && method.getParameterTypes().length == 0)  
                {  
                    if (key.length() == 1)  
                    {  
                        key = key.toLowerCase();  
                    }  
                    else if (!Character.isUpperCase(key.charAt(1)))  
                    {  
                        key = key.substring(0, 1).toLowerCase() + key.substring(1);  
                    }  
                    Object elementObj;
					//try {
						elementObj = method.invoke(bean);
					/*} catch (Exception e) {
						e.printStackTrace();
						elementObj = null;
					}*/  
  
                    //System.out.println("###" + key + ":" + elementObj.toString());  
  
                    sb.append('\"');  
                    sb.append(key); //不能包含特殊字符  
                    sb.append('\"');  
                    sb.append(':');  
                    sb.append(toJson(elementObj)); //循环引用的对象会引发无限递归  
                    sb.append(',');  
                }  
            }  
            catch (final Exception e)  
            {  
                //e.getMessage();  
                throw new RuntimeException("在将bean封装成JSON格式时异常：" + e.getMessage(), e);  
            }  
        }  
        if (sb.length() == 1)  
        {  
            return bean.toString();  
        }  
        else  
        {  
            sb.setCharAt(sb.length() - 1, '}');  
            return sb.toString();  
        }  
    }  
    
}  
